﻿#pragma once

#include "MathOperation.h"

namespace ASL
{

    // 数学运算类
    class ASL_API Propulsion
    {
    public:
        // 工作状态
        enum Phase
        {
            // 关闭状态
            Off = 0,

            // 自旋状态
            Spin,

            // 启动状态
            Start,

            // 运行状态
            Run,
        };

    public:
        // 目标数值变化率函数
        static double seek(double current, double target, double decel, double accel, double T);

        // 目标系数变化率函数
        static double spool(double N, double BPR, double factor, double densityRatio);
    };

    // F100-PW-229涡扇式发动机模型
    class ASL_API F100PW229Turbine
    {
    public:
        // 构造函数
        F100PW229Turbine();

        // 析构函数
        ~F100PW229Turbine();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

        // 启动命令函数
        // 输入 onGround 地面/空中启动模式 -
        // 返回 -
        void starter(bool onGround);

        // 停机命令函数
        // 输入 -
        // 返回 -
        void cutoff(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 节流阀 0~1
            double throttle;

            // 马赫数 -
            double mach;

            // 大气温度 K
            double temperature;

            // 大气密度比 -
            double densityRatio;

            // 大气密度高度 m
            double densityAltitude;

            // 动压 Pa
            double dynamicPressure;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 额定推力 N
            double thrust;

            // 燃油流量 kg/s
            double fuelFlow;

            // 燃油消耗量 kg
            double fuelExpended;

            // 推力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 推力矩 N*m  机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 安装位置 m 结构系 [X, Y, Z]
            ASL::Vector location;

            // 安装角度 deg 结构系 [gamma, psi, zeta]
            ASL::Vector orient;

            // 可用燃油量 kg
            double capacity;

            // 海平面最大推力 N
            double thrustMaximum;

            // 海平面加力推力 N
            double thrustAugmented;

            // 内外涵道空气流量比 0~1
            double bypassRatio;

            // 普通油耗比 kg/s/N
            double TSFC;

            // 加力油耗比 kg/s/N
            double ATSFC;

            // 风扇系数 0~100%
            double N1[2];

            // 核心系数 0~100%
            double N2[2];
        };

    public:
        // 输入端口对象
        F100PW229Turbine::Input input;

        // 输入端口对象
        F100PW229Turbine::Output output;

        // 参数端口对象
        F100PW229Turbine::Parameter parameter;

    private:
        // 工作状态
        int vPhase;

        // 风扇系数
        double vN1;

        // 核心系数
        double vN2;

        // 理论推力
        double vThrust;

        // 燃油流量
        double vFuelFlow;

        // 坐标系投影矩阵 局部系>机体系
        ASL::Matrix cL2B;

        // 动力性能数据
        ASL::LookupTable cThrustMinimun;
        ASL::LookupTable cThrustMaximum;
        ASL::LookupTable cThrustAugmented;

        // 积分器
        ASL::Calculus cN1;
        ASL::Calculus cN2;
        ASL::Calculus cFuelFlow;
        ASL::Calculus cFuelExpended;
    };

    // F119-PW-100涡扇式发动机模型
    class ASL_API F119PW100Turbine
    {
    public:
        // 构造函数
        F119PW100Turbine();

        // 析构函数
        ~F119PW100Turbine();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

        // 启动命令函数
        // 输入 onGround 地面/空中启动模式 -
        // 返回 -
        void starter(bool onGround);

        // 停机命令函数
        // 输入 -
        // 返回 -
        void cutoff(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 节流阀 0~1
            double throttle;

            // 马赫数 -
            double mach;

            // 大气温度 K
            double temperature;

            // 大气密度比 -
            double densityRatio;

            // 大气密度高度 m
            double densityAltitude;

            // 动压 Pa
            double dynamicPressure;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 额定推力 N
            double thrust;

            // 燃油流量 kg/s
            double fuelFlow;

            // 燃油消耗量 kg
            double fuelExpended;

            // 推力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 推力矩 N*m  机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 安装位置 m 结构系 [X, Y, Z]
            ASL::Vector location;

            // 安装角度 deg 结构系 [gamma, psi, zeta]
            ASL::Vector orient;

            // 可用燃油量 kg
            double capacity;

            // 海平面最大推力 N
            double thrustMaximum;

            // 海平面加力推力 N
            double thrustAugmented;

            // 内外涵道空气流量比 0~1
            double bypassRatio;

            // 普通油耗比 kg/s/N
            double TSFC;

            // 加力油耗比 kg/s/N
            double ATSFC;

            // 风扇系数 0~100%
            double N1[2];

            // 核心系数 0~100%
            double N2[2];
        };

    public:
        // 输入端口对象
        F119PW100Turbine::Input input;

        // 输入端口对象
        F119PW100Turbine::Output output;

        // 参数端口对象
        F119PW100Turbine::Parameter parameter;

    private:
        // 工作状态
        int vPhase;

        // 风扇系数
        double vN1;

        // 核心系数
        double vN2;

        // 理论推力
        double vThrust;

        // 燃油流量
        double vFuelFlow;

        // 坐标系投影矩阵 局部系>机体系
        ASL::Matrix cL2B;

        // 动力性能数据
        ASL::LookupTable cThrustMinimun;
        ASL::LookupTable cThrustMaximum;
        ASL::LookupTable cThrustAugmented;

        // 积分器
        ASL::Calculus cN1;
        ASL::Calculus cN2;
        ASL::Calculus cFuelFlow;
        ASL::Calculus cFuelExpended;
    };

    // CFM56涡扇式发动机模型
    class ASL_API CFM56Turbine
    {
    public:
        // 构造函数
        CFM56Turbine();

        // 析构函数
        ~CFM56Turbine();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

        // 启动命令函数
        // 输入 onGround 地面/空中启动模式 -
        // 返回 -
        void starter(bool onGround);

        // 停机命令函数
        // 输入 -
        // 返回 -
        void cutoff(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 节流阀 0~1
            double throttle;

            // 马赫数 -
            double mach;

            // 大气温度 K
            double temperature;

            // 大气密度比 -
            double densityRatio;

            // 大气密度高度 m
            double densityAltitude;

            // 动压 Pa
            double dynamicPressure;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 额定推力 N
            double thrust;

            // 燃油流量 kg/s
            double fuelFlow;

            // 燃油消耗量 kg
            double fuelExpended;

            // 推力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 推力矩 N*m  机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 安装位置 m 结构系 [X, Y, Z]
            ASL::Vector location;

            // 安装角度 deg 结构系 [gamma, psi, zeta]
            ASL::Vector orient;

            // 可用燃油量 kg
            double capacity;

            // 海平面最大推力 N
            double thrustMaximum;

            // 内外涵道空气流量比 0~1
            double bypassRatio;

            // 推力损失系数 -
            double bleed;

            // 额定油耗比 kg/s/N
            double TSFC;

            // 风扇系数 0~100%
            double N1[2];

            // 核心系数 0~100%
            double N2[2];
        };

    public:
        // 输入端口对象
        CFM56Turbine::Input input;

        // 输入端口对象
        CFM56Turbine::Output output;

        // 参数端口对象
        CFM56Turbine::Parameter parameter;

    private:
        // 工作状态
        int vPhase;

        // 风扇系数
        double vN1;

        // 核心系数
        double vN2;

        // 理论推力
        double vThrust;

        // 燃油流量
        double vFuelFlow;

        // 坐标系投影矩阵 局部系>机体系
        ASL::Matrix cL2B;

        // 动力性能数据
        ASL::LookupTable cThrustMinimun;
        ASL::LookupTable cThrustMaximum;

        // 积分器
        ASL::Calculus cN1;
        ASL::Calculus cN2;
        ASL::Calculus cFuelFlow;
        ASL::Calculus cFuelExpended;
    };

    // XLR99火箭式发动机模型
    class ASL_API XLR99Rocket
    {
    public:
        // 构造函数
        XLR99Rocket();

        // 析构函数
        ~XLR99Rocket();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 节流阀 0~1
            double throttle;

            // 大气压强 Pa
            double pressure;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 额定推力 N
            double thrust;

            // 燃油流量 kg/s
            double fuelFlow;

            // 氧化剂流量 kg/s
            double oxidizerFlow;

            // 燃料消耗量 kg
            double fuelExpended;

            // 氧化剂消耗量 kg
            double oxidizerExpended;

            // 推力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 推力矩 N*m  机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 安装位置 m 结构系 [X, Y, Z]
            ASL::Vector location;

            // 安装角度 deg 结构系 [gamma, psi, zeta]
            ASL::Vector orient;

            // 可用燃料量 kg
            double fuelCapacity;

            // 可用氧化剂量 kg
            double oxidizerCapacity;

            // 比冲量 -
            double ISP;

            // 控制阀系数 0~1
            double T[2];

            // 额定燃料流量 kg/s
            double fuelFlow;

            // 额定氧化剂流量 kg/s
            double oxidizerFlow;

            // 喷管面积 m^2
            double nozzleArea;
        };

    public:
        // 输入端口对象
        XLR99Rocket::Input input;

        // 输入端口对象
        XLR99Rocket::Output output;

        // 参数端口对象
        XLR99Rocket::Parameter parameter;

    private:
        // 工作状态
        int vPhase;

        // 流量系数
        double vRate;

        // 坐标系投影矩阵 局部系>机体系
        ASL::Matrix cL2B;

        // 积分器
        ASL::Calculus cFuelExpended;
        ASL::Calculus cOxidizerExpended;
    };

    // T56涡桨式发动机模型
    class ASL_API T56Propeller
    {
    public:
        // 构造函数
        T56Propeller();

        // 析构函数
        ~T56Propeller();

        // 初始化函数
        // 输入 resourceDir 数据文件路径 */data
        // 输入 stepSize 仿真步长 s
        // 返回 return 执行状态 -
        bool initialize(std::string resourceDir, double stepSize);

        // 单步运行函数
        // 输入 -
        // 返回 return 执行状态 -
        bool step(void);

        // 启动命令函数
        // 输入 onGround 地面/空中启动模式 -
        // 返回 -
        void starter(bool onGround);

        // 停机命令函数
        // 输入 -
        // 返回 -
        void cutoff(void);

    public:
        // 输入端口列表
        struct Input
        {
            // 节流阀 0~1
            double throttle;

            // 马赫数 -
            double mach;

            // 大气温度 K
            double temperature;

            // 大气密度 kg/m^3
            double density;

            // 大气密度比 -
            double densityRatio;

            // 大气密度高度 m
            double densityAltitude;

            // 动压 Pa
            double dynamicPressure;

            // 真实空速 m/s 机体系 [X, Y, Z]
            ASL::Vector vBody;

            // 角速度 deg/s 机体系 [X, Y, Z]
            ASL::Vector omega;

            // 重心位置 m 结构系 [X, Y, Z]
            ASL::Vector CG;
        };

        // 输出端口列表
        struct Output
        {
            // 桨叶转速 r/min
            double RPM;

            // 桨叶推力 N
            double thrust;

            // 燃油流量 kg/s
            double fuelFlow;

            // 燃油消耗量 kg
            double fuelExpended;

            // 推力 N 机体系 [X, Y, Z]
            ASL::Vector force;

            // 推力矩 N*m  机体系 [X, Y, Z]
            ASL::Vector torque;
        };

        // 参数端口列表
        struct Parameter
        {
            // 安装位置 m 结构系 [X, Y, Z]
            ASL::Vector location;

            // 安装角度 deg 结构系 [gamma, psi, zeta]
            ASL::Vector orient;

            // 可用燃油量 kg
            double capacity;

            // 海平面最大推力 N
            double thrustMaximum;

            // 额定油耗比 kg/s/N
            double TSFC;

            // 风扇系数 0~100%
            double N1[2];

            // 核心系数 0~100%
            double N2[2];

            // 桨叶数量 -
            int bladeNum;

            // 桨叶直径 m
            double bladeDiameter;

            // 桨叶惯量 kg*m^2
            double bladeInertia;

            // 桨叶角 deg
            double bladePitch[2];

            // 桨叶转速 r/min
            double bladeRPM[2];
        };

    public:
        // 输入端口对象
        T56Propeller::Input input;

        // 输入端口对象
        T56Propeller::Output output;

        // 参数端口对象
        T56Propeller::Parameter parameter;

    private:
        // 工作状态
        int vPhase;

        // 风扇系数
        double vN1;

        // 核心系数
        double vN2;

        // 理论推力
        double vThrust;

        // 燃油流量
        double vFuelFlow;

        // 桨叶转速
        double vRPM;

        // 桨叶倾角
        double vPitch;

        // 坐标系投影矩阵 局部系>机体系
        ASL::Matrix cL2B;

        // 动力性能数据
        ASL::LookupTable vThrustMinimun;
        ASL::LookupTable vThrustMaximum;
        ASL::LookupTable vKThrust;
        ASL::LookupTable vKPower;

        // 积分器
        ASL::Calculus cN1;
        ASL::Calculus cN2;
        ASL::Calculus cRPM;
        ASL::Calculus cPitch;
        ASL::Calculus cFuelFlow;
        ASL::Calculus cFuelExpended;
    };

}